﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using Tibet.Entidades;

namespace Tibet.Logica
{
    class LogicaValidarAtributo : Regla
    {

        //Atributos

        private int _tipo;


        //Propiedades

        public int Tipo
        {
            get { return _tipo; }
            set { _tipo = value; }
        }

        //Metodos
        public LogicaValidarAtributo(int tipo)
        {
            //Constructor
            Tipo = tipo;
        }

        override public Resultado Aplicar(ArrayList archivo)
        {
            try
            {
                if (Tipo == 1)
                    return validar_Amayuscula(archivo);
                if (Tipo == 2)
                    return validar_Aminuscula(archivo);
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        public static Resultado validar_Amayuscula(ArrayList archivo)
        {

            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        if ((linea[AnchoLinea - 1] == ';') && (linea[0] == 'p'))  // se verifica al final de la line que si termina en ) es un metodo
                        {
                            while (i < AnchoLinea)
                            {
                                if (linea[i] == '_')
                                {
                                    if (Char.IsLower(linea[i + 1]) == false)
                                    {
                                        int v = i;
                                        while (v < AnchoLinea)
                                        {
                                            if (Char.IsLower(linea[v]) == false)
                                            {
                                                return Resp;
                                            }
                                            v++;
                                        }
                                    }
                                    else
                                    {
                                        Resp.Mensaje = "No se cumple con los estadares de la regla. Linea " + LineaActual;
                                        Resp.Linea = LineaActual;
                                        Resp.Respuesta = false;
                                    }
                                }
                                i++;
                            }
                        }
                    }
                }
                return Resp;
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

        public static Resultado validar_Aminuscula(ArrayList archivo)
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        if ((linea[AnchoLinea - 1] == ';') && (linea[0] == 'p'))  // se verifica al final de la line que si termina en ) es un metodo
                        {
                            while (i < AnchoLinea)
                            {
                                if (linea[i] == '_')
                                {
                                    if (Char.IsLower(linea[i + 1]) == true)
                                    {
                                        int v = i;
                                        while (v < AnchoLinea)
                                        {
                                            if (Char.IsLower(linea[v]) == false)
                                            {
                                                Resp.Respuesta = true;
                                                return Resp;
                                            }
                                            v++;
                                        }
                                    }
                                    else
                                    {
                                        Resp.Mensaje = "No se cumple con los estadares de la regla. Linea " + LineaActual;
                                        Resp.Linea = LineaActual;
                                        Resp.Respuesta = false;
                                    }
                                }
                                i++;
                            }
                        }
                    }
                }
                return Resp;
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

    }
}